package com.wjm.servlet;

import com.wjm.http.HttpRequest;
import com.wjm.http.HttpResponse;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;

/**
 * Data:2022年08月15日
 * Author:wjm
 * Content:
 *
 *   根据javaEE（企业级应用开发）的标准开发规范，设定业务处理的类都应该是一个具体的服务端应用程序
 *   这样的应用程序就被称为servlet
 *   按照开发的规范，业务处理都是在service方法中实现的
 *   数据的获取是通过 封装了客户端请求信息的HttpRequest对象
 *   数据的响应是通过 封装了服务费响应信息的HttpResponse对象
 *
 *   其实在javaEE中，Servlet是一个标准的接口
 *
 *   该类是用来处理注册请求的
 *
 */
public class RegisterServlet {

    public void service(HttpResponse response, HttpRequest request){
        //获取数据
        String username = request.getParameters("user");
        String password = request.getParameters("pwd");
        String sex = request.getParameters("sex");
        String age = request.getParameters("age");

        //对数据进行判断，是否为空，并且age是否有除数字外的字符
        if (username==null || password==null || sex==null || age==null || !age.matches("[0-9]+")){
            File file = new File("./webapps/myweb/register_error.html");
            //如果符合以上的条件，则把错误的页面传给HttpResponse响应给客户端展示
            response.setFileEntity(file);

        }else {//如果校验通过，就进行数据写入
            //创建RandomAccessFile对象
            try(RandomAccessFile randomAccessFile = new RandomAccessFile("user.txt","rw");) {

                //在将文件写入之前要判断一下用户是否存在
                for (int i=0;i<randomAccessFile.length()/100;i++){
                    //对指针的位置进行设置,因为每个用户数据都是100字节，所以0，100，200...后面读取32个字节都是用户名数据
                    randomAccessFile.seek(i*100);
                    //创建一个字节数组用于读取每个用户的用户名
                    byte[] data = new byte[32];
                    //读取已存在的用户名
                    randomAccessFile.read(data);
                    //将读到的字节数组转化为字符串
                    String name = new String(data,"utf-8");
                    //因为32位的字节数组中包含空字符，在转化位字符串时也转化了过来，所以需要进行去除空字符，在进行比较的时候才能比较
                    name = name.trim();
                    if (username.equals(name)){
                        //如果已存在，则把已存在的页面传给HttpResponse响应给客户端展示
                        File file = new File("./webapps/myweb/register_have.html");
                        response.setFileEntity(file);
                        //运行结束
                        return;
                    }

                }
                //写入数据之前，都要将指针移动到文件末尾，这样做的就是拼接，而不是覆盖
                randomAccessFile.seek(randomAccessFile.length());


                        /*
                            给每个用户的所包含的数据都分配100个字节的空间，不然每个用户所包含的数据长度都不一样，在后续的读取的中不好操作。
                            给username分配32个字节，password分配32字节，sex分配32字节，age分配4字节
                            将username，password，sex都放在byte[]数组中，无论byte数组是否放满，最后都进行扩容到32字节的长度
                            因为已经将age转成int类型，所有他本身就是4个字节不需要用byte数组存储

                        */
                //将字符串转化为byte数组
                byte[] bytes = username.getBytes("utf-8");
                //对数组进行扩容到32字节长度
                bytes = Arrays.copyOf(bytes,32);
                //将username写入到user.txt文件中
                randomAccessFile.write(bytes);

                //将字符串转化为byte数组
                bytes = password.getBytes("utf-8");
                //对数组进行扩容到32字节长度
                bytes = Arrays.copyOf(bytes,32);
                //将password写入到user.txt文件中
                randomAccessFile.write(bytes);

                //将字符串转化为byte数组
                bytes = sex.getBytes("utf-8");
                //对数组进行扩容到32字节长度
                bytes = Arrays.copyOf(bytes,32);
                //将sex写入到user.txt文件中
                randomAccessFile.write(bytes);

                //将String的age，转化为int类型，通过包装类的拆装箱机制
                //将age写入到user.txt文件中
                randomAccessFile.writeInt(Integer.valueOf(age));

                //返回注册成功页面
                File file = new File("./webapps/myweb/register_success.html");
                response.setFileEntity(file);
                return;

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }




    }


}
